Skip to main content

15 流媒体协议

视频概览

  • AVI、MPEG、RMVB、MP4、MOV、FLV、WebM、WMV、ASF、MKV
  • H.261、 H.262、H.263、H.264、H.265
  • MPEG-1、MPEG-2、MPEG-4、MPEG-7

视频就是快速播放一连串连续的图片。每一张图片称为一帧。每秒 30 帧,帧率(FPS)就是 30。每一张图片都是由像素组成的,假设为 1024*768,每个像素由 RGB 组成,每个 8 位,共 24 位。

30 帧 × 1024 × 768 × 24 = 566,231,040Bits = 70,778,880Bytes

编码:用尽量少的 Bit 数保存视频,使播放的时候画面看起来仍然很精美。编码是一个压缩的过程。

视频和图片的压缩过程

  1. 空间冗余:图像的相邻像素之间有较强的相关性,一张图片相邻像素往往是渐变的,不是突变的,没必要每个像素都完整地保存,可以隔几个保存一个,中间的用算法计算出来。
  2. 时间冗余:视频序列的相邻图像之间内容相似。一个视频中连续出现的图片也不是突变的,可以根据已有的图片进行预测和推断。
  3. 视觉冗余:人的视觉系统对某些细节不敏感,因此不会每一个细节都注意到,可以允许丢失一些数据。
  4. 编码冗余:不同像素值出现的概率不同,概率高的用的字节少,概率低的用的字节多,类似霍夫曼编码(Huffman Coding)的思路。

视频编码的两大流派

  • ITU(International Telecommunications Union)的 VCEG(Video Coding Experts Group),国际电联下的 VCEG,主要侧重传输。
  • ISO(International Standards Organization)的 MPEG(Moving Picture Experts Group),ISO 旗下的 MPEG,主要侧重视频存储。
  • ITU-T(国际电信联盟电信标准化部门,ITU Telecommunication Standardization Sector)与 MPEG 联合制定的 H.264/MPEG-4 AVC。

直播视频流

接流:网络协议将编码好的视频流,从主播端推送到服务器,在服务器上有个运行了同样协议的服务端来接收这些网络包,从而得到里面的视频流

转码:服务端接到视频流之后,可以对视频流进行一定的处理,例如转码,即从一个编码格式,转成另一种格式。客户端千差万别,要保证都能看到直播。

拉流:流处理完毕之后,等待观众的客户端来请求这些视频流。

解码:通过上述过程的逆过程,将一串串看不懂的二进制,再转变成一帧帧生动的图片,在客户端播放出来

编码

  • I 帧,也称关键帧。里面是完整的图片,只需要本帧数据,就可以完成解码。
  • P 帧,前向预测编码帧。P 帧表示的是这一帧跟之前的一个关键帧(或 P 帧)的差别,解码时需要用之前缓存的画面,叠加上和本帧定义的差别,生成最终画面。
  • B 帧,双向预测内插编码帧。B 帧记录的是本帧与前后帧的差别。要解码 B 帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的数据与本帧数据的叠加,取得最终的画面。

通过时序进行编码

压缩成一个二进制流,网络提取层单元(NALU,Network Abstraction Layer Unit),分成一个个的单元方便传输。

一个视频,可以拆分成一系列的帧,每一帧拆分成一系列的片,每一片都放在一个 NALU 里面,NALU 之间都是通过特殊的起始标识符分隔,在每一个 I 帧的第一片前面,要插入单独保存 SPS 和 PPS 的 NALU,最终形成一个长长的 NALU 序列。

推流

使用 RTMP 协议将这个二进制的流打包成网络包进行发送。

  • 版本号
  • 时间戳

拉流